Introduction

#something

Lorem ipsum

Libraries

library(tidyverse)
library(httr)
library(readxl)
library(plotly)
library(gganimate)

Preprocessing

Import

# embed code from https://data.world/makeovermonday/2021w5
GET("https://query.data.world/s/rnsywm4k4ae3vz2iitu6cg4sww6xbc", 
    write_disk(tf <- tempfile(fileext = ".xlsx")))
raw <- read_excel(tf)

Refactor columns

data <- raw %>%
  select(Year = Year, Country = Area, Source = Variable,
         Production = `Generation (TWh)`) %>%
  mutate(across(c(Country, Source), factor))

data$Year <- as.integer(data$Year)
data

Handle Sources

View all Sources

data %>%
  group_by(Source) %>%
  summarise(Total.TWh = sum(Production))

Define Source types

sources <- list(
  fossil = c("Hard Coal", "Lignite", "Gas", "Other fossil"),
  renewable = c("Hydro", "Wind", "Solar", "Bioenergy", "Other renewables"),
  nuclear = c("Nuclear"),
  demand = c("Demand")
)
sources$base <- c(sources$fossil, sources$renewable, sources$nuclear)

Define Source colors

sources$palette <- c("Hard Coal" = "orangered4",
                     "Lignite" = "saddlebrown",
                     "Gas" = "darkgoldenrod",
                     "Other fossil" = "darkgray",
                     "Hydro" = "royalblue",
                     "Wind" = "skyblue",
                     "Solar" = "gold",
                     "Bioenergy" = "forestgreen",
                     "Other renewables" = "springgreen3",
                     "Nuclear" = "orchid4")

sources$broad.palette <- c("Renewables" = "forestgreen", 
                           "Fossil" = "saddlebrown",
                           "Nuclear" = "orchid4")

sources$broad <- c("Fossil", "Renewables", "Nuclear")
data <- data %>%
  mutate(across(Source, factor, levels = c(sources$base, "Demand")))
saveRDS(sources, "sources.rds")

Add Broad Source

data <- data %>%
  mutate(Broad.Source = factor(case_when(
    Source %in% sources$renewable ~ "Renewables",
    Source %in% sources$fossil ~ "Fossil",
    Source %in% sources$nuclear ~ "Nuclear"
    )))
data <- data %>%
  mutate(across(Broad.Source, factor, levels = sources$broad))

Filter irrelevant Sources

data <- data %>%
  filter(Source %in% c(sources$base, "Demand"))

Handle Countries

View all Countries

data %>%
  filter(Source == "Demand") %>%
  group_by(Country) %>%
  summarise(Total.Production = sum(Production))

Filter irrelevant Countries

data <- data %>%
  filter(!Country == "EU-27")

Save

saveRDS(data, "data.rds")

Plots

Prepare theme

theme_update(text = element_text(size = 20, color = "gray81"),
             rect = element_rect(fill = "gray14"),
             axis.text = element_text(color = "gray48"),
             panel.background = element_rect(fill = "gray10"),
             panel.grid = element_line(color = "gray15"),
             legend.key = element_rect(fill = "gray14")
             )

Good news


# data <- readRDS("data.rds")
# sources <- readRDS("sources.rds")
data %>%
  filter(!is.na(Broad.Source)) %>%
  group_by(Year, Broad.Source) %>%
  summarise(Total.Production = sum(Production), .groups = "drop_last") %>%
  ggplot(aes(x = Year, y = Total.Production, color = Broad.Source)) +
  geom_line(size = 2) +
  scale_color_manual(values = sources$broad.palette) +
  theme(legend.position = "bottom") +
  labs(title = "Energy generation sources",
       subtitle = "EU27+1 countries") +
  ylab("Total Generation (TWh)")

Variable by country by year

src_by_country_by_year <- function(country, year) {
  filtered_data <- data %>%
    filter(Country == country & Year == year & Source %in% sources$base)
  filtered_data %>%
    ggplot() +
      geom_col(aes(x = Broad.Source, y = Production,
                   fill = Source), width = 0.7) +
      scale_fill_manual(values = sources$palette) +
      labs(title = "Energy generation sources",
           subtitle = paste(country, " (", year, ")", sep = ""))
}

# src_by_country_by_year("Romania", 2010)
ggplotly()

Variable by country

src_by_country <- function(country) {
  broad_data <- data %>%
    filter(Country == country & Source %in% sources$base) %>%
    group_by(Year, Broad.Source) %>%
    summarise(Total.Production = sum(Production), .groups = "keep")
  
  demand_data <- data %>%
    filter(Country == country & Source == "Demand")
  
  data %>%
    filter(Country == country & Source %in% sources$base) %>%
    ggplot() +
      geom_area(aes(x = Year, y = Production, fill = Source), alpha = 1) +
      scale_fill_manual(values = sources$palette) +
      geom_line(data = broad_data,
                mapping = aes(x = Year, y = Total.Production,
                              group = Broad.Source),
                position = "stack", size = 1) +
      geom_line(data = demand_data,
                mapping = aes(x = Year, y = Production),
                color = "white", size = 1.5) +
      labs(title = "Energy generation sources evolution",
           subtitle = country)
}

src_by_country("Austria")

# ggplotly()
LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpc2F0aW9uIC0gRXVyb3BlIEVuZXJneSBQcm9kdWN0aW9uIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICBmaWdfd2lkdGg6IDkKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIHRoZW1lOiBkYXJrbHkKICAgIGhpZ2hsaWdodDogYnJlZXplZGFyawogICAga2VlcF9tZDogdHJ1ZQotLS0KIyB7LnRhYnNldH0KCiMjIEludHJvZHVjdGlvbiAKYGBge3IgZmlsZT0nLi4vc3JjL3ByZXByb2Nlc3MuUid9CgpgYGAKCgoKTG9yZW0gaXBzdW0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQob3V0LndpZHRoID0gOSwgb3V0LmhlaWdodCA9IDYpCmBgYAoKIyMjIExpYnJhcmllcwoKYGBge3IgbGlicmFyaWVzLCByZXN1bHRzPSdoaWRlJ30KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaHR0cikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnYW5pbWF0ZSkKYGBgCgojIyBQcmVwcm9jZXNzaW5nIHsudGFic2V0fQoKIyMjIEltcG9ydAoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSdoaWRlJ30KIyBlbWJlZCBjb2RlIGZyb20gaHR0cHM6Ly9kYXRhLndvcmxkL21ha2VvdmVybW9uZGF5LzIwMjF3NQpHRVQoImh0dHBzOi8vcXVlcnkuZGF0YS53b3JsZC9zL3Juc3l3bTRrNGFlM3Z6MmlpdHU2Y2c0c3d3NnhiYyIsIAogICAgd3JpdGVfZGlzayh0ZiA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gIi54bHN4IikpKQpyYXcgPC0gcmVhZF9leGNlbCh0ZikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfSAKcmF3CmBgYAoKIyMjIFJlZmFjdG9yIGNvbHVtbnMKCmBgYHtyfQpkYXRhIDwtIHJhdyAlPiUKICBzZWxlY3QoWWVhciA9IFllYXIsIENvdW50cnkgPSBBcmVhLCBTb3VyY2UgPSBWYXJpYWJsZSwKICAgICAgICAgUHJvZHVjdGlvbiA9IGBHZW5lcmF0aW9uIChUV2gpYCkgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKENvdW50cnksIFNvdXJjZSksIGZhY3RvcikpCgpkYXRhJFllYXIgPC0gYXMuaW50ZWdlcihkYXRhJFllYXIpCmBgYAoKCmBgYHtyfQpkYXRhCmBgYAoKCiMjIyBIYW5kbGUgU291cmNlcyB7LnRhYnNldH0KCiMjIyMgVmlldyBhbGwgU291cmNlcwpgYGB7cn0KZGF0YSAlPiUKICBncm91cF9ieShTb3VyY2UpICU+JQogIHN1bW1hcmlzZShUb3RhbC5UV2ggPSBzdW0oUHJvZHVjdGlvbikpCmBgYAoKIyMjIyBEZWZpbmUgU291cmNlIHR5cGVzCgpgYGB7cn0Kc291cmNlcyA8LSBsaXN0KAogIGZvc3NpbCA9IGMoIkhhcmQgQ29hbCIsICJMaWduaXRlIiwgIkdhcyIsICJPdGhlciBmb3NzaWwiKSwKICByZW5ld2FibGUgPSBjKCJIeWRybyIsICJXaW5kIiwgIlNvbGFyIiwgIkJpb2VuZXJneSIsICJPdGhlciByZW5ld2FibGVzIiksCiAgbnVjbGVhciA9IGMoIk51Y2xlYXIiKSwKICBkZW1hbmQgPSBjKCJEZW1hbmQiKQopCnNvdXJjZXMkYmFzZSA8LSBjKHNvdXJjZXMkZm9zc2lsLCBzb3VyY2VzJHJlbmV3YWJsZSwgc291cmNlcyRudWNsZWFyKQpgYGAKCgojIyMjIERlZmluZSBTb3VyY2UgY29sb3JzCgpgYGB7cn0Kc291cmNlcyRwYWxldHRlIDwtIGMoIkhhcmQgQ29hbCIgPSAib3JhbmdlcmVkNCIsCiAgICAgICAgICAgICAgICAgICAgICJMaWduaXRlIiA9ICJzYWRkbGVicm93biIsCiAgICAgICAgICAgICAgICAgICAgICJHYXMiID0gImRhcmtnb2xkZW5yb2QiLAogICAgICAgICAgICAgICAgICAgICAiT3RoZXIgZm9zc2lsIiA9ICJkYXJrZ3JheSIsCiAgICAgICAgICAgICAgICAgICAgICJIeWRybyIgPSAicm95YWxibHVlIiwKICAgICAgICAgICAgICAgICAgICAgIldpbmQiID0gInNreWJsdWUiLAogICAgICAgICAgICAgICAgICAgICAiU29sYXIiID0gImdvbGQiLAogICAgICAgICAgICAgICAgICAgICAiQmlvZW5lcmd5IiA9ICJmb3Jlc3RncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICJPdGhlciByZW5ld2FibGVzIiA9ICJzcHJpbmdncmVlbjMiLAogICAgICAgICAgICAgICAgICAgICAiTnVjbGVhciIgPSAib3JjaGlkNCIpCgpzb3VyY2VzJGJyb2FkLnBhbGV0dGUgPC0gYygiUmVuZXdhYmxlcyIgPSAiZm9yZXN0Z3JlZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvc3NpbCIgPSAic2FkZGxlYnJvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVjbGVhciIgPSAib3JjaGlkNCIpCgpzb3VyY2VzJGJyb2FkIDwtIGMoIkZvc3NpbCIsICJSZW5ld2FibGVzIiwgIk51Y2xlYXIiKQpkYXRhIDwtIGRhdGEgJT4lCiAgbXV0YXRlKGFjcm9zcyhTb3VyY2UsIGZhY3RvciwgbGV2ZWxzID0gYyhzb3VyY2VzJGJhc2UsICJEZW1hbmQiKSkpCnNhdmVSRFMoc291cmNlcywgInNvdXJjZXMucmRzIikKYGBgCgoKIyMjIyBBZGQgQnJvYWQgU291cmNlCgpgYGB7cn0KZGF0YSA8LSBkYXRhICU+JQogIG11dGF0ZShCcm9hZC5Tb3VyY2UgPSBmYWN0b3IoY2FzZV93aGVuKAogICAgU291cmNlICVpbiUgc291cmNlcyRyZW5ld2FibGUgfiAiUmVuZXdhYmxlcyIsCiAgICBTb3VyY2UgJWluJSBzb3VyY2VzJGZvc3NpbCB+ICJGb3NzaWwiLAogICAgU291cmNlICVpbiUgc291cmNlcyRudWNsZWFyIH4gIk51Y2xlYXIiCiAgICApKSkKZGF0YSA8LSBkYXRhICU+JQogIG11dGF0ZShhY3Jvc3MoQnJvYWQuU291cmNlLCBmYWN0b3IsIGxldmVscyA9IHNvdXJjZXMkYnJvYWQpKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmRhdGEKYGBgCgoKCgojIyMjIEZpbHRlciBpcnJlbGV2YW50IFNvdXJjZXMKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgZmlsdGVyKFNvdXJjZSAlaW4lIGMoc291cmNlcyRiYXNlLCAiRGVtYW5kIikpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGF0YQpgYGAKCgoKIyMjIEhhbmRsZSBDb3VudHJpZXMgey50YWJzZXR9CiMjIyMgVmlldyBhbGwgQ291bnRyaWVzCmBgYHtyfQpkYXRhICU+JQogIGZpbHRlcihTb3VyY2UgPT0gIkRlbWFuZCIpICU+JQogIGdyb3VwX2J5KENvdW50cnkpICU+JQogIHN1bW1hcmlzZShUb3RhbC5Qcm9kdWN0aW9uID0gc3VtKFByb2R1Y3Rpb24pKQpgYGAKIyMjIyBGaWx0ZXIgaXJyZWxldmFudCBDb3VudHJpZXMKCmBgYHtyfQpkYXRhIDwtIGRhdGEgJT4lCiAgZmlsdGVyKCFDb3VudHJ5ID09ICJFVS0yNyIpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGF0YQpgYGAKCgojIyMgU2F2ZQoKYGBge3J9CnNhdmVSRFMoZGF0YSwgImRhdGEucmRzIikKYGBgCgoKIyMgUGxvdHMgey50YWJzZXR9CgojIyMgUHJlcGFyZSB0aGVtZQoKYGBge3J9CnRoZW1lX3VwZGF0ZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiZ3JheTgxIiksCiAgICAgICAgICAgICByZWN0ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTE0IiksCiAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JheTQ4IiksCiAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTEwIiksCiAgICAgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkxNSIpLAogICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxNCIpCiAgICAgICAgICAgICApCmBgYAoKCiMjIyBHb29kIG5ld3MKCmBgYHtyIGZpZy53aWR0aD05Ljd9CgojIGRhdGEgPC0gcmVhZFJEUygiZGF0YS5yZHMiKQojIHNvdXJjZXMgPC0gcmVhZFJEUygic291cmNlcy5yZHMiKQpkYXRhICU+JQogIGZpbHRlcighaXMubmEoQnJvYWQuU291cmNlKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgQnJvYWQuU291cmNlKSAlPiUKICBzdW1tYXJpc2UoVG90YWwuUHJvZHVjdGlvbiA9IHN1bShQcm9kdWN0aW9uKSwgLmdyb3VwcyA9ICJkcm9wX2xhc3QiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVG90YWwuUHJvZHVjdGlvbiwgY29sb3IgPSBCcm9hZC5Tb3VyY2UpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAyKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHNvdXJjZXMkYnJvYWQucGFsZXR0ZSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh0aXRsZSA9ICJFbmVyZ3kgZ2VuZXJhdGlvbiBzb3VyY2VzIiwKICAgICAgIHN1YnRpdGxlID0gIkVVMjcrMSBjb3VudHJpZXMiKSArCiAgeWxhYigiVG90YWwgR2VuZXJhdGlvbiAoVFdoKSIpCmBgYAoKIyMjIFZhcmlhYmxlIGJ5IGNvdW50cnkgYnkgeWVhcgoKYGBgIHtyfQpzcmNfYnlfY291bnRyeV9ieV95ZWFyIDwtIGZ1bmN0aW9uKGNvdW50cnksIHllYXIpIHsKICBmaWx0ZXJlZF9kYXRhIDwtIGRhdGEgJT4lCiAgICBmaWx0ZXIoQ291bnRyeSA9PSBjb3VudHJ5ICYgWWVhciA9PSB5ZWFyICYgU291cmNlICVpbiUgc291cmNlcyRiYXNlKQogIGZpbHRlcmVkX2RhdGEgJT4lCiAgICBnZ3Bsb3QoKSArCiAgICAgIGdlb21fY29sKGFlcyh4ID0gQnJvYWQuU291cmNlLCB5ID0gUHJvZHVjdGlvbiwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTb3VyY2UpLCB3aWR0aCA9IDAuNykgKwogICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBzb3VyY2VzJHBhbGV0dGUpICsKICAgICAgbGFicyh0aXRsZSA9ICJFbmVyZ3kgZ2VuZXJhdGlvbiBzb3VyY2VzIiwKICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKGNvdW50cnksICIgKCIsIHllYXIsICIpIiwgc2VwID0gIiIpKQp9CgojIHNyY19ieV9jb3VudHJ5X2J5X3llYXIoIlJvbWFuaWEiLCAyMDEwKQpgYGAKCmBgYHtyIGZpZy53aWR0aCA9IDkuNywgZmlnLmhlaWdodCA9IDZ9CiMgZ2dwbG90bHkoKQpgYGAKCgojIyMgVmFyaWFibGUgYnkgY291bnRyeQoKYGBge3IgZmlnLndpZHRoPTkuN30Kc3JjX2J5X2NvdW50cnkgPC0gZnVuY3Rpb24oY291bnRyeSkgewogIGJyb2FkX2RhdGEgPC0gZGF0YSAlPiUKICAgIGZpbHRlcihDb3VudHJ5ID09IGNvdW50cnkgJiBTb3VyY2UgJWluJSBzb3VyY2VzJGJhc2UpICU+JQogICAgZ3JvdXBfYnkoWWVhciwgQnJvYWQuU291cmNlKSAlPiUKICAgIHN1bW1hcmlzZShUb3RhbC5Qcm9kdWN0aW9uID0gc3VtKFByb2R1Y3Rpb24pLCAuZ3JvdXBzID0gImtlZXAiKQogIAogIGRlbWFuZF9kYXRhIDwtIGRhdGEgJT4lCiAgICBmaWx0ZXIoQ291bnRyeSA9PSBjb3VudHJ5ICYgU291cmNlID09ICJEZW1hbmQiKQogIAogIGRhdGEgJT4lCiAgICBmaWx0ZXIoQ291bnRyeSA9PSBjb3VudHJ5ICYgU291cmNlICVpbiUgc291cmNlcyRiYXNlKSAlPiUKICAgIGdncGxvdCgpICsKICAgICAgZ2VvbV9hcmVhKGFlcyh4ID0gWWVhciwgeSA9IFByb2R1Y3Rpb24sIGZpbGwgPSBTb3VyY2UpLCBhbHBoYSA9IDEpICsKICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gc291cmNlcyRwYWxldHRlKSArCiAgICAgIGdlb21fbGluZShkYXRhID0gYnJvYWRfZGF0YSwKICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSBUb3RhbC5Qcm9kdWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IEJyb2FkLlNvdXJjZSksCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJzdGFjayIsIHNpemUgPSAxKSArCiAgICAgIGdlb21fbGluZShkYXRhID0gZGVtYW5kX2RhdGEsCiAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBZZWFyLCB5ID0gUHJvZHVjdGlvbiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxLjUpICsKICAgICAgbGFicyh0aXRsZSA9ICJFbmVyZ3kgZ2VuZXJhdGlvbiBzb3VyY2VzIGV2b2x1dGlvbiIsCiAgICAgICAgICAgc3VidGl0bGUgPSBjb3VudHJ5KQp9CgojIHNyY19ieV9jb3VudHJ5KCJBdXN0cmlhIikKYGBgCgoKCgpgYGB7ciBmaWcud2lkdGg9OS43LCBmaWcuaGVpZ2h0PTd9CiMgZ2dwbG90bHkoKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=